## [1.5. "Разнесение" файлов с исходными текстами по директориям](https://www.opennet.ru/docs/RUS/gnumake/#Make)
Приведенный в предыдущем параграфе make-файл вполне работоспособен и с успехом может быть использован для сборки небольших программ. Однако, с увеличением размера программы, становится не очень удобным хранить все файлы с исходными текстами в одном каталоге. В таком случае я предпочитаю "разносить" их по разным директориям, отражающим логическую структуру проекта. Для этого нужно немного модифицировать make-файл. Чтобы неявное правило
   %.o: %.cpp
        gcc -c $< 
осталось работоспособным, я использую переменную VPATH, в которой перечисляются все директории, где могут располагаться исходные тексты. В следующем примере я поместил файлы Editor.cpp и Editor.h в каталог Editor, а файлы TextLine.cpp и TextLine.h в каталог TextLine:

example_4-multidir /
main.cpp
main.h
Editor /
Editor.cpp
Editor.h
TextLine /
TextLine.cpp
TextLine.h
Makefile
Вот как выглядит Makefile для этого примера:
    #
    #   example_4-multidir/Makefile
    # 
    #   Пример "разнесения" исходных текстов по разным директориям
    #

    source_dirs := . Editor TextLine

    search_wildcards := $(addsuffix /*.cpp,$(source_dirs)) 

    iEdit: $(notdir $(patsubst %.cpp,%.o,$(wildcard $(search_wildcards))))
        gcc $^ -o $@ 

    VPATH := $(source_dirs)
     
    %.o: %.cpp
        gcc -c -MD $(addprefix -I,$(source_dirs)) $<

    include $(wildcard *.d) 
По сравнению с предыдущим вариантом make-файла он претерпел следующие изменения:

Для хранения списка директорий с исходными текстами я завел отдельную переменную source_dirs, поскольку этот список понадобится указывать в нескольких местах.
Шаблон поиска для функции wildcard (переменная search_wildcards) строится "динамически" исходя из списка директорий source_dirs
Используется переменная VPATH для того, чтобы шаблонное правило могло искать файлы исходных текстов в указанном списке директорий
Компилятору разрешается искать заголовочные файлы во всех директориях с исходными текстами. Для этого используется функция addprefix и флажок -I компилятора GCC.
При формировании списка объектных файлов, из имен исходных файлов "убирается" имя каталога, где они расположены (с помощью функции notdir)